import numpy as np
import pandas as pd
from scipy.interpolate import lagrange
#s是原始数据，n是插补位置（索引），k为前后数据个数，number为第几次插补
def ployinterp_column(s,n,k,number):
    # range随机数,取出前k个随机数
    y1 = list(range(n-k,n))
    # 后k个随机数
    y2 = list(range(n+1,n+k+1))
    #取出原数据对应的值
    y = s.reindex(y1+y2)
    #删除空值
    y = y[y.notnull()]
    #判断是否至少有两个值用于生成拉格朗日
    if len(y) <2:
        print('前后非空数据长度小于二，无法使用拉格朗日方法')
        return np.nan
    else:
        # 根据数据拉格朗日
        ln = lagrange(y.index, list(y))
        print("构建的拉格朗日公式为：")
        print(ln)
        x = ln(n)
        # abs绝对值
        return int(abs(x))
#定义初始变量
dic = {"姓名":['小千','小锋','小亮','小可'],
       "性别":['男','男','男','女'],
       '数学成绩':[89,90,None,94],
       "语文成绩":[81,87,None,95]}
#转换成表格样式
data = pd.DataFrame(dic)
print("原始数据：")
print(data)
number = 0
for i in data.columns:#列的标签
    for j in range(len(data)):#行
        #验证是否为空
        if (data[i].isnull())[j]:
            number+=1
            print(f'这是第{number}次插补数据：')
            print(data[i])
            data.at[j,i] = ployinterp_column(data[i],j,1,number)
            print(f'这是第{number}次插补后的数据：')
            print(data[i])
print(f'共插补了了{number}个数据')
print("最终数据为:")
print(data)


